#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

//主要内容总结：
//进程等待、进程终止、获得进程的运行状态

int main()
{

  printf("before : pid = %d\n",getpid());
  pid_t id = fork();
  sleep(1);
  printf("after : pid = %d\n",getpid());
 
  if(id<0)
  {
    perror("fork");
    exit(1);//进程运行结果不正确
  }  
//  else if(id ==0)
//  {
//    int cnt = 5;
//    while(cnt)
//    {
//      printf("cnt = %d,子进程pid = %d,父进程ppid = %d\n",cnt,getpid(),getppid());
//      sleep(1);
//      cnt--;
//      //测试信号码异常情况
//      int a = 0;
//      a-=1;
//    }
//  //  printf("子进程:pid = %d,ppid = %d\n",getpid(),getppid());
//  //  sleep(1);
//    exit(100);
//  }
  else
  {
    printf("父进程:pid = %d,ppid = %d\n",getpid(),getppid());
    int status = 0 ;
    pid_t  ret= waitpid(id,&status,0);
    if(ret>0)
    {
      //检测进程退出方法一
      // printf("等待子进程退出成功;ret = %d , 子进程退出码：%d,子进程收到的信号编码为：%d\n",ret,(status>>8)&0xFF,status&0x7F);
      //检测进程退出的方法二
      if(ret>0)
      {
        if(WIFEXITED(status))
        {
          //子进程正常退出时
        }
        else
        {
          printf("子进程异常退出：%d\n",WIFEXITED(status));
        }
      }
    }
  }
//  if (id<0)
//  {
//    perror("fork");
//    exit(1);
//  }
//  printf("hello world!\n");
  return 0;
}
